计算机密码学与算法工具(Cryptography & Algorithm Tools)
密码学是信息安全的基石,涵盖机密性、完整性、认证和不可否认性四大安全目标。本文档以 UML 行为图→结构图的递进方式梳理计算机密码学体系,包含对称/非对称加密、哈希、数字签名、TLS 协议、后量子密码等核心领域。
1. 系统概览 — 用例图(Use Case Diagram)
用例图从整体视角展示密码学系统对外提供的安全服务及其参与者(Actor):普通用户、系统管理员、攻击者、外部服务。
- 对称加密(Symmetric Encryption)
- 加密和解密使用同一密钥的算法,速度快,适合大数据量加密。代表:AES、SM4、ChaCha20。
- 非对称加密(Asymmetric Encryption)
- 使用公钥加密、私钥解密的算法,适合密钥交换和数字签名。代表:RSA、ECDH、SM2。
- 数字签名(Digital Signature)
- 用私钥生成签名、公钥验证,保证消息完整性和发送者身份。代表:Ed25519、ECDSA。
2. 对称加密流程 — 活动图(Activity Diagram)
活动图展示现代 AEAD(认证加密)模式下的加密/解密核心流程,重点显示 AES-GCM 的 CTR 加密 + GHASH 认证两路并行机制。
- AEAD(Authenticated Encryption with Associated Data)
- 加密的同时提供完整性认证,单趟完成加密+MAC。推荐模式:AES-GCM、ChaCha20-Poly1305。
- 失败关闭(Fail Closed)
- 安全设计原则:认证失败时拒绝输出任何数据,不泄露信息给攻击者。对比"失败开放 Fail Open"是危险的反模式。
# AES-256-GCM 加密 echo "sensitive data" | openssl enc -aes-256-gcm -K $(xxd -p -c64 key.bin) -iv $(xxd -p -c12 iv.bin) -out cipher.bin # ChaCha20-Poly1305 加密 openssl enc -chacha20-poly1305 -K $(xxd -p -c32 key.bin) -iv $(xxd -p -c12 iv.bin) -in plain.txt -out cipher.bin
3. TLS 1.3 握手 — 时序图(Sequence Diagram)
时序图完整展示 TLS 1.3 的 1-RTT 握手机制:ClientHello 即带 DH 密钥共享参数,服务端回应后双方即可开始加密通信。
- 1-RTT(One Round Trip Time)
- TLS 1.3 的核心优化,ClientHello 直接携带 DH 参数,减少一次往返。TLS 1.2 需要 2-RTT。
- 前向安全(PFS, Perfect Forward Secrecy)
- 长期密钥泄露不会暴露历史会话密钥。TLS 1.3 强制使用临时 DH 密钥交换,强制 PFS。
- HKDF(HMAC-based Key Derivation Function)
- 基于 HMAC 的密钥派生函数(RFC 5869),将共享密钥派生为多把会话密钥(加密密钥、MAC 密钥、IV)。
# 连接并显示握手详情 openssl s_client -connect example.com:443 -tls1_3 -msg -keylogfile keys.txt # 查看证书链 openssl s_client -connect example.com:443 -tls1_3 -showcerts 2>&1 | openssl x509 -text -noout # cipher 优先级 openssl ciphers -v -tls1_3 | column -t
4. 密钥生命周期管理 — 状态机图(State Machine Diagram)
状态机图展示密码学密钥从生成到销毁的完整生命周期,覆盖 NIST SP 800-57 标准定义的密钥状态变迁。
- CSPRNG(Cryptographically Secure Pseudo-Random Number Generator)
- 密码学安全的伪随机数生成器。Golang
crypto/rand、Linux/dev/urandom、getrandom()。 - HSM(Hardware Security Module)
- 硬件安全模块,密钥在安全芯片内部生成和使用,永不离开硬件。代表:YubiKey、AWS CloudHSM。
#include <sodium.h> // 生成 X25519 密钥对 unsigned char pk[crypto_kx_PUBLICKEYBYTES]; unsigned char sk[crypto_kx_SECRETKEYBYTES]; crypto_kx_keypair(pk, sk); // 使用密钥... // 安全擦除(sodium 提供 sodium_memzero) sodium_memzero(sk, sizeof sk);
5. 密码学系统组件架构 — 组件图(Component Diagram)
组件图从软件架构视角展示密码学系统的模块分层:应用层、协议层、密码原语层、硬件抽象层,以及各组件之间的依赖关系。
- Noise Protocol Framework
- 模块化安全通道协议框架,WireGuard、WhatsApp 底层使用。握手模式以 NN/KN/KK/XX 等字母组合命名。
- Double Ratchet(双棘轮)
- Signal 协议核心机制,DH 棘轮保证前向安全,对称棘轮保证消息独立密钥,后向安全(泄露后恢复)。
- AES-NI(AES New Instructions)
- Intel/AMD CPU 的 AES 硬件加速指令集,GCM 模式下可达 1-2 GB/s 吞吐。
6. 密码学算法分类体系 — 包图(Package Diagram)
包图展示密码学算法的完整分类树,从顶层安全目标出发,按加密方式、哈希、签名等维度逐级分类,涵盖当前推荐和已弃用的算法。
7. 加密基元类模型 — 类图(Class Diagram)
类图展示密码学基础类型的抽象继承关系和组合关系:Cipher、Hash、MAC、KDF、AEAD 等基元的 API 模型。
- API 防御性设计
- 高层 API 封装底层算法,默认安全(防误用)。如 libsodium 的
crypto_secretbox集成加密+认证,不暴露裸 AES。 - 组合优于继承
- 密码学中 MAC 不是 Cipher 的子类(不能解密),AEAD 组合 Cipher 和 MAC 两个接口。
from cryptography.hazmat.primitives.ciphers.aead import AESGCM import os key = AESGCM.generate_key(bit_length=256) aesgcm = AESGCM(key) nonce = os.urandom(12) ct = aesgcm.encrypt(nonce, b"secret message", b"auth data") pt = aesgcm.decrypt(nonce, ct, b"auth data") assert pt == b"secret message"
8. 密码学系统部署架构 — 部署图(Deployment Diagram)
部署图展示密码学在不同环境中的部署形态:客户端(移动/桌面/浏览器)、服务端(负载均衡/TLS 终结)、HSM 设备、区块链节点。
- mTLS(Mutual TLS)
- 双向 TLS 认证,服务端和客户端互相验证证书,常用于微服务间零信任通信(如 Istio Service Mesh)。
- TLS 终结(TLS Termination)
- 在反向代理(Nginx/Envoy)上解密 TLS,内网以 HTTP 转发。优点:集中证书管理和加速卸载。
- PKCS#11
- 密码令牌接口标准,应用程序通过统一 API 访问 HSM 设备的密码学操作,厂商无关。
9. Demo 代码演示
9.1 多语言对称加密示例
package main
import (
"crypto/aes"
"crypto/cipher"
"crypto/rand"
"io"
)
func encrypt(plaintext, key []byte) ([]byte, error) {
block, _ := aes.NewCipher(key)
aesgcm, _ := cipher.NewGCM(block)
nonce := make([]byte, aesgcm.NonceSize())
io.ReadFull(rand.Reader, nonce)
return aesgcm.Seal(nonce, nonce, plaintext, nil), nil
}
use chacha20poly1305::{
ChaCha20Poly1305, Key, Nonce, aead::Aead
};
use rand::rngs::OsRng;
let key = Key::from_slice(&[0u8; 32]);
let cipher = ChaCha20Poly1305::new(key);
let nonce = Nonce::from_slice(&[0u8; 12]);
let ct = cipher.encrypt(nonce, b"hello".as_ref())
.expect("encryption failure");
9.2 数字签名与密钥交换
package main
import (
"crypto/ed25519"
"crypto/rand"
)
pub, priv, _ := ed25519.GenerateKey(rand.Reader)
message := []byte("hello world")
sig := ed25519.Sign(priv, message)
ok := ed25519.Verify(pub, message, sig)
// ok == true
from cryptography.hazmat.primitives.asymmetric.x25519 import X25519PrivateKey
from cryptography.hazmat.primitives.kdf.hkdf import HKDF
from cryptography.hazmat.primitives import hashes
alice = X25519PrivateKey.generate()
bob = X25519PrivateKey.generate()
alice_shared = alice.exchange(bob.public_key())
bob_shared = bob.exchange(alice.public_key())
assert alice_shared == bob_shared
derived = HKDF(
algorithm=hashes.SHA256(), length=32, salt=None, info=b'handshake',
).derive(alice_shared)
9.3 密码哈希与存储
import "golang.org/x/crypto/argon2"
func hashPassword(pw, salt []byte) []byte {
return argon2.IDKey(pw, salt,
1, // iterations
64*1024, // memory (64 MB)
4, // parallelism
32, // 输出 32 bytes
)
}
// OWASP 2023 推荐:
// iterations≥2, memory≥46MB
import blake3 h = blake3.blake3(b"hello world") digest = h.digest() # 32 bytes hex_digest = h.hexdigest() # 增量哈希 h2 = blake3.blake3() h2.update(b"hello ") h2.update(b"world") assert h2.digest() == digest # 键控模式(MAC) k = blake3.derive_key(b"app key") mac = blake3.blake3(b"message", key=k).digest()
9.4 TLS 编程
package main
import (
"crypto/tls"
"net/http"
)
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("secure"))
})
srv := &http.Server{
Addr: ":8443",
Handler: mux,
TLSConfig: &tls.Config{
MinVersion: tls.VersionTLS13,
CurvePreferences: []tls.CurveID{
tls.X25519,
},
},
}
srv.ListenAndServeTLS("cert.pem", "key.pem")
}
use std::sync::Arc;
use rustls::ClientConfig;
let root_store = rustls::RootCertStore {
roots: webpki_roots::TLS_SERVER_ROOTS.to_vec(),
};
let config = ClientConfig::builder()
.with_root_certificates(root_store)
.with_no_client_auth();
let server_name = "example.com"
.try_into()
.unwrap();
let mut conn = rustls::ClientConnection::new(
Arc::new(config), server_name
).unwrap();
10. 实战速查手册(Quick Reference)
10.1 算法选择速查(2024+)
| 用途 | 首选 | 备选 | 国密 |
|---|---|---|---|
| 对称加密 | AES-256-GCM | ChaCha20-Poly1305 | SM4-CTR |
| 密钥交换 | X25519 | X448 | SM2 KEX |
| 数字签名 | Ed25519 | Ed448, ECDSA | SM2 Sign |
| 哈希 | SHA-256 | BLAKE2b, SHA3-256 | SM3 |
| 密码存储 | Argon2id | bcrypt (cost≥12) | - |
| MAC | HMAC-SHA256 | KMAC | - |
| KDF | HKDF-SHA256 | - | - |
| 安全通道 | TLS 1.3 | WireGuard | GM/T TLS |
| 后量子 KEM | Kyber (ML-KEM) | - | - |
10.2 坚决禁止列表
| 禁用技术 | 原因 | 替代方案 |
|---|---|---|
| MD5 | 已破解(2004 王小云) | SHA-256 |
| SHA-1 | 实际碰撞(SHAttered 2017) | SHA-256 |
| RC4 | 严重偏差漏洞 | ChaCha20 |
| DES / 3DES | 密钥过短 / 慢 | AES |
| ECB 模式 | 模式泄露(企鹅图) | GCM / CTR |
| CBC 模式 (新系统) | Padding Oracle | GCM |
| RSA PKCS#1 v1.5 加密 | Bleichenbacher 攻击 | RSA-OAEP, ECDH |
| RSA-1024 | 可分解 | RSA-2048+ |
| SSL 2.0 / 3.0 / TLS 1.0 / 1.1 | 多重攻击 | TLS 1.3 |
rand() / Math.random() | 非密码学安全 | crypto/rand / getrandom() |
| 自研密码算法 | 100% 有漏洞 | 使用标准化算法 |
10.3 TLS 1.3 密码套件速查
| 套件名 | 场景 |
|---|---|
TLS_AES_128_GCM_SHA256 | 强制实现通用场景,硬件加速好 |
TLS_AES_256_GCM_SHA384 | 高安全需求 |
TLS_CHACHA20_POLY1305_SHA256 | 推荐移动端纯软件性能优秀 |
TLS_AES_128_CCM_SHA256 | IoT / 受限设备 |
10.4 编程库选择速查
| 语言 | 首选 | 说明 |
|---|---|---|
| C/C++ | libsodium | NaCl 继承,新项目首选,安全默认 |
| C/C++ (全功能) | OpenSSL 3.x | 全能但 API 复杂,历史负担重 |
| C/C++ (嵌入式) | mbedTLS / wolfSSL | 轻量,ARM 维护 |
| Rust | RustCrypto + rustls | 纯 Rust,类型安全,零开销 |
| Go | crypto/* 标准库 | Google 维护,性能优秀 |
| Python | cryptography | 高层+底层 API,推荐 |
| JS/Node | 内置 crypto / Web Crypto | 标准库,libsodium.js 做补充 |
| Java/Kotlin | Google Tink | 防误用高层 API |
| Swift | CryptoKit | Apple 原生,硬件加速 |
| 国密 | Tongsuo (铜锁) | 蚂蚁集团,国密+TLS |
10.5 OpenSSL 常用命令速查
| 操作 | 命令 |
|---|---|
| 生成 Ed25519 密钥 | openssl genpkey -algorithm ED25519 -out key.pem |
| 提取公钥 | openssl pkey -in key.pem -pubout -out pub.pem |
| 生成自签证书 | openssl req -x509 -newkey ed25519 -keyout key.pem -out cert.pem -days 365 -nodes |
| 查看证书 | openssl x509 -in cert.pem -text -noout |
| 生成 CSR | openssl req -new -key key.pem -out req.csr |
| 计算 SHA-256 | openssl dgst -sha256 file.bin |
| 生成随机字节 | openssl rand -hex 32 |
| AES-GCM 加密 | openssl enc -aes-256-gcm -K hexkey -iv hexiv -in plain -out cipher |
| TLS 连接测试 | openssl s_client -connect host:443 -tls1_3 |
| 证书指纹 | openssl x509 -in cert.pem -fingerprint -sha256 |
| 速度基准 | openssl speed -evp aes-256-gcm |
| 检查私钥 | openssl pkey -in key.pem -check -noout |
10.6 STRIDE 威胁建模
| 威胁类型 | 含义 | 防护手段 |
|---|---|---|
| Spoofing (欺骗) | 冒充合法用户或服务 | 数字签名 + 证书 (mTLS) |
| Tampering (篡改) | 数据在传输或存储中被修改 | AEAD / HMAC / 数字签名 |
| Repudiation (否认) | 行为后可抵赖 | 数字签名 + 时间戳 + 审计日志 |
| Information Disclosure (泄露) | 数据被未授权方获取 | 加密 (TLS/AES) |
| Denial of Service (拒绝服务) | 服务不可用 | 限流 / 冗余 / 无状态设计 |
| Elevation of Privilege (提权) | 获取未授权的权限 | 最小权限 / 零信任 / RBAC |
10.7 密钥长度对照
| 安全级别 | 对称 | RSA | ECC | 哈希 |
|---|---|---|---|---|
| 80-bit | 80 | 1024 | 160 | 160 |
| 112-bit | 112 | 2048 | 224 | 224 |
| 128-bit (推荐) | 128 | 3072 | 256 | 256 |
| 192-bit | 192 | 7680 | 384 | 384 |
| 256-bit | 256 | 15360 | 512 | 512 |
11. 特殊签名方案与 ECDSA 陷阱
11.1 特殊签名方案
| 方案 | 特性 | 应用 |
|---|---|---|
| Schnorr 签名 | 线性可聚合,高效批量验证 | Bitcoin Taproot (BIP-340) |
| BLS 签名 | 短签名,原生支持聚合 | Ethereum 2.0 验证者签名 |
| 环签名 Ring Signature | 签名者匿名在群组内 | Monero 隐私交易 |
| 盲签名 Blind Signature | 签名者不知晓签名内容 | 电子投票、匿名凭证 |
| 群签名 Group Signature | 群组签名可追溯 | 企业审计、可信硬件 |
| 门限签名 Threshold | m-of-n 阈值签名重建 | MPC 钱包 (Fireblocks/Copper) |
| 多重签名 Multi-sig | 多密钥独立签名验证 | Bitcoin 多签地址 |
| Lamport 签名 | 哈希一次性签名 | 后量子候选,SPHINCS+ 基础 |
11.2 ECDSA 签名时序图 — Nonce 重用的毁灭性后果
- Malleability(可延展性)
- ECDSA 签名 (r, s) 可被变形为 (r, -s mod n) 仍为有效签名。Bitcoin 通过 SegWit 隔离见证解决此问题。
- RFC 6979 确定性 ECDSA
- 使用 HMAC 从私钥和消息哈希确定性派生 nonce k,消除随机数源风险。全标准化。
12. Noise Protocol Framework — 时序图(Sequence Diagram)
Noise 是模块化构建安全通道的协议框架,WireGuard(Noise_IK)、WhatsApp、Slack 底层均使用。核心组件:DH 密钥交换 + HKDF 密钥派生 + AEAD 加密。
- MixKey(c_k, input_key_material)
- Noise 核心操作:HKDF(c_k, ikm) → 新 c_k + temp_k。链式派生保证一个密钥泄露不影响其他。
- 握手模式命名规则
- N=无静态密钥, K=已知对方静态, X=传输静态, I=立即传输静态。如 NN(无认证), KK(双向静态已知), IK(发起方立即认证)。
| 协议 | Noise 模式 | 说明 |
|---|---|---|
| WireGuard | Noise_IK | 发起方立即认证,响应方动态公布 |
| Noise_XX + Double Ratchet | 双向动态认证 + 棘轮持续更新 | |
| Slack Nebula | Noise_XX | 双向认证覆盖网络 |
| Lightning Network | Noise_XK | 已知响应方静态密钥 |
import "github.com/audibleblink/cacophony"
cfg := cacophony.Config{
Pattern: "XX",
Cipher: "AESGCM",
Curve: "25519",
}
hs := cacophony.NewHandshakeState(cfg, cacophony.Initiator, nil, nil)
hs.WriteMessage(nil, nil)
hs.ReadMessage(nil, nil)
enc, dec := hs.Split()
13. 零知识证明 ZKP — 时序图(Sequence Diagram)
零知识证明允许证明者向验证者证明某陈述为真,而不泄露任何额外信息。满足完备性(真陈述可证)、可靠性(假陈述不可证)、零知识性。
| 方案 | 特点 | 证明大小 | 应用 |
|---|---|---|---|
| zk-SNARK (Groth16) | 需可信设置,极小证明 | ~200 bytes | Zcash, Tornado Cash |
| zk-SNARK (PLONK) | 通用可信设置 | ~800 bytes | Aztec, Mina |
| zk-STARK | 无可信设置,抗量子 | ~100 KB | StarkNet, StarkWare |
| Bulletproofs | 无可信设置,短证明 | ~700 bytes | Monero 隐私交易 |
14. 同态加密 HE — 组件图(Component Diagram)
同态加密允许在不解密的情况下对密文进行计算,结果解密后等价于对明文直接计算。按支持运算次数分级:部分同态 (PHE)、部分全同态 (SWHE)、全同态 (FHE)。
- Bootstrapping(自举)
- FHE 核心操作:将密文"刷新"以降低噪声,使得无限次运算成为可能。TFHE 的自举在毫秒级,是当前最快方案。
- 噪声累积
- 每次同态运算都会增加密文噪声,超过阈值后解密失败。自举可以重置噪声水平。
15. 安全多方计算 MPC — 时序图(Sequence Diagram)
MPC 允许多方在不泄露各自输入的前提下联合计算某个函数。核心技术:秘密共享、混淆电路、不经意传输。
| 技术路线 | 通信量 | 计算量 | 适用方数 | 代表工具 |
|---|---|---|---|---|
| 混淆电路 Yao GC | 低 | 高 (AES 调用多) | 2 | EMP-toolkit |
| 秘密共享 GMW/SPDZ | 高 | 中 | 任意 | MP-SPDZ |
| 不经意传输 OT | 预计算 | 低(在线期) | 2 | libOTe |
| 同态 + MPC 混合 | 低 | 极高 | 任意 | SCALE-MAMBA |
16. 区块链密码学 — 组件图(Component Diagram)
- Merkle Tree(默克尔树)
- 哈希二叉树,叶节点为原始数据哈希,逐层哈希到根。O(log n) 验证成员。Bitcoin 区块头存 Merkle Root,轻节点用 Merkle Proof 验证交易。
- KZG 承诺(Kate-Zaverucha-Goldberg)
- 多项式承诺方案,Ethereum Proto-Danksharding (EIP-4844) 用于 Blob 验证。支持高效批量证明和向量承诺。
- Stealth Address(隐身地址)
- 每次收款生成一次性地址,外部无法关联到真实地址。Monero 和 Zcash 均使用。
16.1 区块链签名算法对比
| 链 | 签名算法 | 哈希 | 特色 |
|---|---|---|---|
| Bitcoin | ECDSA secp256k1 → Schnorr | SHA-256 × 2 | Taproot 升级后支持 Schnorr 聚合 |
| Ethereum | ECDSA secp256k1 | Keccak-256 | BLS 用于 Eth2 共识签名 |
| Solana | Ed25519 | SHA-256 | 硬件友好,GPU 加速验证 |
| Cardano | Ed25519 + BLS | BLAKE2b | 双签名方案,BLS 用于 KES |
| Polkadot | sr25519 (Schnorr/Ed25519 混合) | BLAKE2 | 高效批量验证 |
| Monero | Ed25519 + Ring Signatures | Keccak | 环签名隐藏发送者 |
| Zcash | zk-SNARK (Groth16) | BLAKE2b | 零知识保护交易金额和地址 |
17. 匿名通信 — 部署图(Deployment Diagram)
| 系统 | 路由机制 | 延迟 | 适用场景 |
|---|---|---|---|
| Tor | 洋葱路由,3层中继加密 | 高 (300ms+) | 匿名浏览、隐藏服务 |
| I2P | 大蒜路由,单向隧道 | 极高 | 内部匿名网络 |
| Mixminion | 多轮混合,批量延迟 | 极高 (分钟级) | 强匿名邮件(学术) |
| Signal | Sealed Sender 隐藏发送者 | 低 | 即时通讯 |
18. 密码学历史里程碑
| 年份 | 事件 |
|---|---|
| 1976 | Diffie-Hellman 密钥交换论文发表,公钥密码学元年 |
| 1977 | RSA 算法发布 (Rivest-Shamir-Adleman) |
| 1985 | 椭圆曲线密码 ECC 独立提出 (Koblitz, Miller) |
| 1991 | PGP (Pretty Good Privacy) 发布,首个大众加密工具 |
| 1994 | Shor 量子算法发布,威胁 RSA/ECC;SSL 2.0 (Netscape) |
| 2000 | AES (Rijndael) 选定为新加密标准 (FIPS 197) |
| 2004 | 王小云团队破解 MD5 碰撞;SHA-1 理论攻击 |
| 2008 | Bitcoin 白皮书发布,中本聪创世区块 |
| 2013 | Snowden 事件揭露大规模监控;Signal Protocol 诞生 |
| 2017 | SHAttered:Google 实现 SHA-1 实际碰撞 |
| 2018 | TLS 1.3 (RFC 8446);WireGuard 发布 |
| 2019 | Argon2 选定为密码哈希标准 (OWASP 推荐) |
| 2022 | zk-Rollups 在以太坊大规模部署 |
| 2024-2025 | NIST 后量子密码标准 FIPS 203/204/205 正式发布 (Kyber/Dilithium/SPHINCS+) |
文档维护:深圳市微架构科技有限公司 / 董事会 / 全球产品 - 编码系统